class CDiscretePosition
{
public:
    CDiscretePosition(const Ogre::Vector3& vec, float flTimestamp) : m_vectorPosition(vec), m_flTimestamp(flTimestamp) { }
    const Ogre::Vector3& GetPosition() { return m_vectorPosition; }
    float GetTimestamp() { return m_flTimestamp; }

private:
    Ogre::Vector3 m_vectorPosition;
    float m_flTimestamp;
};

class CPositionPredictor
{
public:

    CPositionPredictor() { }
    void Reset(float flBufferTime, float flNetworkInterval, float flStartTime, const Ogre::Vector3& startPosition);

    void AddDiscretePosition(const Ogre::Vector3& vectorNew);

    void GetCurrentPosition(Ogre::Vector3& vectorCurrent, float flCurrentTime);

private:
    float m_flNextAddTime;
    float m_flBufferTime;
    float m_flNetworkInterval;
    float m_flStartTime;

    vector<CDiscretePosition> discretePositions;
};
